{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 什么是集成学习"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn import datasets\n",
    "\n",
    "X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1141ca048>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[y==0,0], X[y==0,1])\n",
    "plt.scatter(X[y==1,0], X[y==1,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.86399999999999999"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "log_clf = LogisticRegression()\n",
    "log_clf.fit(X_train, y_train)\n",
    "log_clf.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.88800000000000001"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "\n",
    "svm_clf = SVC()\n",
    "svm_clf.fit(X_train, y_train)\n",
    "svm_clf.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.86399999999999999"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "dt_clf = DecisionTreeClassifier(random_state=666)\n",
    "dt_clf.fit(X_train, y_train)\n",
    "dt_clf.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_predict1 = log_clf.predict(X_test)\n",
    "y_predict2 = svm_clf.predict(X_test)\n",
    "y_predict3 = dt_clf.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_predict = np.array((y_predict1 + y_predict2 + y_predict3) >= 2, dtype='int')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 0, 0, 1, 1, 1, 0, 0, 0, 0])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_predict[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.89600000000000002"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "accuracy_score(y_test, y_predict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用Voting Classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.ensemble import VotingClassifier\n",
    "\n",
    "voting_clf = VotingClassifier(estimators=[\n",
    "    ('log_clf', LogisticRegression()), \n",
    "    ('svm_clf', SVC()),\n",
    "    ('dt_clf', DecisionTreeClassifier(random_state=666))],\n",
    "                             voting='hard')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.89600000000000002"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "voting_clf.fit(X_train, y_train)\n",
    "voting_clf.score(X_test, y_test)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
